﻿//#include <iostream>
//using namespace std;
//template <class T>
//bool compare(T x, T y) {
//	return x > y;
//}
//int main()
//{
//	int _x = 1;
//	int _y = 2;
//	int _z = 3;
//	cout << compare(_z, _y) << endl; //这里比较正确
//
//	int* x = new int(1);
//	int* y = new int(2);
//	int* z = new int(3);
//	cout << compare(z, y) << endl; //发现这里答案错误，因为比较的是地址，地址的大小这里每次都会变化
//	return 0;
//}

//#include <iostream>
//using namespace std;
////函数模板 -- 参数匹配
//template <class T>
//bool compare(T x, T y) {
//	return x > y;
//}
////对compare函数模板进行特化
//template <>
//bool compare<int*>(int* x, int* y) {
//	return *x > *y;
//}
//int main()
//{
//	int _x = 1;
//	int _y = 2;
//	int _z = 3;
//	cout << compare(_z, _y) << endl; //这里比较正确
//
//	int* x = new int(1);
//	int* y = new int(2);
//	int* z = new int(3);
//	cout << compare(z, y) << endl; //传入的类型是int*,满足特化类型，直接传入特化
//	return 0;
//}

//#include <iostream>
//using namespace std;
//template<class T1, class T2>
//class Data
//{
//public:
//	Data() { cout << "Data<T1, T2>" << endl; }
//private:
//	T1 _d1;
//	T2 _d2;
//};
////全特化，直接特化为int,char
//template<>
//class Data<int, char>
//{
//public:
//	Data() { cout << "Data<int, char>" << endl; }
//private:
//	int _d1;
//	char _d2;
//};

//template<class T1, class T2>
//class Data
//{
//public:
//	Data() { cout << "Data<T1, T2>" << endl; }
//private:
//	T1 _d1;
//	T2 _d2;
//};
////只将T2进行特化，T2在模板类型列表中直接省略，跟函数特化原理一样
//template <class T1>
//class Data<T1, int>
//{
//public:
//	Data() { cout << "Data<T1, int>" << endl; }
//private:
//	T1 _d1;
//	int _d2;
//};

//#include <iostream>
//using namespace std;
////原模版
//template<class T1, class T2>
//class Data
//{
//public:
//	Data() { cout << "Data<T1, T2>" << endl; }
//private:
//	T1 _d1;
//	T2 _d2;
//};
////两个参数偏特化为指针类型
//template <class T1, class T2>
//class Data <T1*, T2*>
//{
//public:
//	Data() { cout << "Data<T1*, T2*>" << endl; }
//private:
//	//这里的_d1和_d2为T1型和T2型，不是T1*和T2*
//	T1 _d1;
//	T2 _d2;
//};
////T2被特化为double类型，T1被特化为T1*类型
//template <class T1>
//class Data <T1*, double>
//{
//public:
//	Data() { cout << "Data<T1*, double>" << endl; }
//private:
//	T1* _d1;
//	double _d2;
//};
//int main()
//{
//	Data<double, int> d1;  //输出Data<T1, T2>
//	Data<int*, double> d2; //输出Data<T1*, double>
//	Data<int*, int*> d3;   //输出Data<T1*, T2*>
//	return 0;
//}

//偏特化的注意const使用注意
//#include <iostream>
//using namespace std;
//template <class T>
//class compare
//{
//public:
//	bool operator()(const T& x, const T& y)
//	{
//		return x > y;
//	}
//};
////偏特化
//template <class T>
//class less<T*>
//{
//public:
//	//const T*& x这里的const修饰的是T*,没有修饰引用&,所以当进行隐式类型转换产生临时变量时不能接收。
////这里应改为const T* const & x
//	bool operator()(const T*& x, const T*& y)  //注意:这里的const修饰的是T*，即是非const引用修饰T*类型
//	{
//		return *x > *y;
//	}
//};